home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / dosnos2.arc / DOSKNOW2.ASM < prev    next >
Assembly Source File  |  1986-01-19  |  62KB  |  1,526 lines

  1.         PAGE 60,132
  2.         TITLE   Main routine for DosKnows Series
  3.         SUBTTL  Calls upon routines in Convrs.asm
  4.  
  5.  
  6. ;-----------------------------------------------------------------------;
  7. ; Dosknows              Oct  30, 1985           Version 1.20            ;
  8. ;                                                                       ;
  9. ;       This program tells you of all (in the sense, that I put them    ;
  10. ;    there) the things it knows of your hardware and operating environ- ;
  11. ;    ment.  You can do anything you want with it.  If you add some      ;
  12. ;    things to it, let me know.  I really would like to see the amount  ;
  13. ;    of memory in a system, amount free, amount used up by this pgm.    ;
  14. ;    Well, that is exactly what this new version has added.             ;
  15. ;                                                                       ;
  16. ;       For those who've been putting off trying to learn assembler,    ;
  17. ;    try this.  I've commented things a lot, maybe it can help.         ;
  18. ;                                                                       ;
  19. ;       By the way, you'll also need covers.asm, and the makefile       ;
  20. ;    will help you masm and link it.                                    ;
  21. ;                                                                       ;
  22. ;       January 19, 1986   -- Update                                    ;
  23. ;                                                                       ;
  24. ;       This new version of dosknows also displays the amount of        ;
  25. ;       memory being used, free, and total in the system.  It took      ;
  26. ;       a while to find it, but its not in here.  Procedure SHOWMEM     ;
  27. ;       is the new procedure called from within the procedure           ;
  28. ;       MOREPSP.                                                        ;
  29. ;                                                                       ;
  30. ;       The file convers.asm has not been affected by this addition.    ;
  31. ;                                                                       ;
  32. ;       Anil Bharvaney                                                  ;
  33. ;       Compuserve 72057,1103                                           ;
  34. ;-----------------------------------------------------------------------;
  35.  
  36.  
  37.         EXTRN  Stdin:Near, Stdout:Near, Strout:Near, ToHex:Near
  38.         EXTRN  ToDec:Near, ToDecW:Near
  39.  
  40.  
  41.         SUBTTL  All major equates are placed here
  42.         PAGE
  43.  
  44.  
  45.         ;-------------------------------------------------------;
  46.         ;       ALL MAJOR EQUATES ARE PLACED RIGHT BELOW        ;
  47.         ;-------------------------------------------------------;
  48.  
  49. DOS             EQU     21H
  50. CR              EQU     0DH
  51. LF              EQU     0AH
  52. TAB             EQU     09H
  53. TERMINATOR      EQU     '$'     ;dos string terminator
  54. ENVAREA         EQU     2CH     ;offset into psp for start of environment
  55. SEGLEFT         EQU     06H     ;offset into psp for bytes remainging in segment
  56. PGMTERMINATE    EQU     0AH     ;offset into psp for program terminate handler
  57. CONTROL_C       EQU     0EH     ;offset into psp for Control C exit handler
  58. CRITICAL        EQU     12H     ;offset into psp for critical error handler
  59. CURRDISK        EQU     19H     ;dos func for inquiring current drive
  60. LOGDISK         EQU     0EH     ;dos func to log to a drive
  61. GETDATE         EQU     2AH     ;dos func to get date
  62. GETTIME         EQU     2CH     ;dos func to get time
  63. GETVERSION      EQU     30H     ;dos func to get version #
  64. CTRLCHECK       EQU     33H     ;dos func to get ^c check status
  65. GETINTVEC       EQU     35H     ;dos func to get int vector address
  66. DISKSPACE       EQU     36H     ;dos func to get disk information
  67. COUNTRYINFO     EQU     38H     ;dos func to get country dependent info
  68. CDIR            EQU     47H     ;dos func to get current directory text
  69. VERIFY          EQU     54H     ;dos func to return status of verify on write
  70.  
  71.  
  72.  
  73.  
  74.         SUBTTL  Stack is defined here
  75.         PAGE
  76.  
  77.  
  78.  
  79. SSEG    SEGMENT STACK
  80.         DW      128 DUP(?)
  81. SSEG    ENDS
  82.  
  83.  
  84.  
  85.         SUBTTL Data Segment for this source file is here
  86.         PAGE
  87.  
  88.  
  89. DSEG    SEGMENT PUBLIC PARA 'DATA'
  90.  
  91. MSG0    DB      'Program Started : ',Terminator                         ;*
  92. MSG1    DB      'Program Segment Address is at          : ',Terminator  ;*
  93. MSG2    DB      'Environment Space begins at            : ',Terminator  ;*
  94. MSG2A   DB      'Environment Space contains:',CR,LF,Terminator          ;*
  95. MSG3    DB      'Bytes left in current segment          : ',Terminator  ;*
  96. MSG3A   DB      'Total memory found                     : ',Terminator
  97. MSG3B   DB      'Memory being used                      : ',Terminator
  98. MSG3C   DB      'Memory free                            : ',Terminator
  99. MSG3D   DB      ' bytes',Terminator
  100. MSG4    DB      'Current logged drive is                : ',Terminator  ;*
  101. MSG5    DB      'Current Directory is                   : ',Terminator  ;*
  102. MSG6    DB      'Number of logical drives found         : ',Terminator  ;*
  103. MSG7    DB      'Logged Drive Statistics:',CR,LF,Terminator             ;*
  104. MSG8    DB      '       Number of available clusters    : ',Terminator  ;*
  105. MSG9    DB      '       Number of clusters per drive    : ',Terminator  ;*
  106. MSG10   DB      '       Number of bytes per sector      : ',Terminator  ;*
  107. MSG11   DB      '       Number of sectors per cluster   : ',Terminator  ;*
  108. MSG12   DB      '       Bytes used on current drive     : ',Terminator  ;*
  109. MSG13   DB      '       Bytes remaining on current drive: ',Terminator  ;*
  110. MSG13A  DB      '       Bytes capacity of current drive : ',Terminator  ;*
  111. MSG14   DB      '       Write verify for drive is       : ',Terminator  ;*
  112. MSG15   DB      'DOS version number is                  : ',Terminator  ;*
  113. MSG16   DB      'OEM number is                          : ',Terminator  ;*
  114. MSG17   DB      'User number is                         : ',Terminator  ;*
  115. MSG18   DB      'Control C check (Break status) is      : ',Terminator  ;*
  116. MSG19   DB      'Interrupt Vector Addresses:',CR,LF,TERMINATOR          ;*
  117. MSG20   DB      '       Program terminate address (20H) : ',Terminator  ;*
  118. MSG21   DB      '       DOS function request addr (21H) : ',Terminator  ;*
  119. MSG22   DB      '       Terminate address         (22H) : ',Terminator  ;*
  120. MSG23   DB      '       Control C exit address    (23H) : ',Terminator  ;*
  121. MSG24   DB      '       Fatal error abort address (24H) : ',Terminator  ;*
  122. MSG25   DB      'Address from Program Segment Prefix:',CR,LF,TERMINATOR ;*
  123. MSG26   DB      '       Program terminate address (22H) : ',Terminator  ;*
  124. MSG27   DB      '       Control-C address         (23H) : ',Terminator  ;*
  125. MSG28   DB      '       Critical err handler addr (24H) : ',Terminator  ;*
  126. MSG29   DB      'Country Dependent Information:',CR,LF,TERMINATOR
  127. USA     DB      '       Set for USA standard  h:m:s m/d/y',CR,LF,TERMINATOR
  128. EUROPE  DB      '       Set for EUROPE h:m:s d/m/y',CR,LF,TERMINATOR
  129. JAPAN   DB      '       Set for JAPAN  y/m/d h:m:s',CR,LF,TERMINATOR
  130. MSG30   DB      '       Currency symbol defined         : ',Terminator
  131. MSG31   DB      '       Thousands separator             : ',Terminator
  132. MSG32   DB      '       Decimal separator               : ',Terminator
  133. MSG33   DB      '       Date separator                  : ',Terminator
  134. MSG34   DB      '       Time separator                  : ',Terminator
  135. BIT00   DB      '       Currency symbol precedes amount',CR,LF,TERMINATOR
  136. BIT01   DB      '       Currency symbol comes after amount',CR,LF,TERMINATOR
  137. BIT10   DB      '       Currency symbol immediately precedes amount',CR,LF,TERMINATOR
  138. BIT11   DB      '       Is a space between currency symbol and amount',CR,LF,TERMINATOR
  139. MSG35   DB      '       Number of decimal places shown  : ',Terminator
  140. MSG36   DB      '       Time format is                  : ',Terminator
  141. MSG37   DB      '       Location of case mapping routine: ',Terminator
  142. MSG38   DB      '       Data list separator symbol      : ',Terminator
  143. ON      DB      'ON',CR,LF,TERMINATOR
  144. OFF     DB      'OFF',CR,LF,TERMINATOR
  145. FORM12  DB      '12 hour format',CR,LF,TERMINATOR
  146. FORM24  DB      '24 hour format',CR,LF,TERMINATOR
  147. ERRMSG  DB      'Properly installed only for DOS Versions above 2.00',CR,LF,TERMINATOR
  148. ERR1    DB      'Ouch! Dos refused to tell me! Sob, sob, sob.',CR,LF,Terminator
  149. SORRY   DB      'Sorry, there is something wrong.',TERMINATOR
  150. MORE    DB      'Press any key to continue.....',Terminator
  151. CURDRIV DB      ?               ;current drive, 0=a:, 1=b:
  152. USED_1  DW      ?               ;bytes used on disk
  153. USED_2  DW      ?               ;
  154. FREE_1  DW      ?               ;free space on disk
  155. FREE_2  DW      ?
  156. TOTAL_1 DW      ?               ;avai space on disk
  157. TOTAL_2 DW      ?
  158. MAJVERS DB      ?               ;major version #
  159. MINVERS DB      ?               ;minor version #
  160. PSP     DW      ?               ;keep psp segment address here
  161. MEMTOP  DW      ?               ;top of memory in paragraph form
  162. MEMBOT  DW      ?               ;bottom of memory in paragraph form
  163. ENV     DW      ?               ;segment of environment variable strings
  164.  
  165.  
  166. MSG_TABLE       LABEL WORD
  167.         DW      OFFSET MSG20
  168.         DW      OFFSET MSG21
  169.         DW      OFFSET MSG22
  170.         DW      OFFSET MSG23
  171.         DW      OFFSET MSG24
  172.  
  173.  
  174. CTRY_INFO       LABEL BYTE
  175. DATE_TIME_FORMAT        DW      ?
  176. CURRENCY_SYMBOL         DB      5 DUP (?)
  177. THOUSANDS_SEPARATOR     DW      ?
  178. DECIMAL_SEPARATOR       DW      ?
  179. DATE_SEPARATOR          DW      ?
  180. TIME_SEPARATOR          DW      ?
  181. BIT_FIELD               DB      ?
  182. CURRENCY_PLACES         DB      ?
  183. TIME_FORMAT             DB      ?
  184. CASE_MAPPING_CALL       DW      2 DUP (?)
  185. DATA_LIST_SEPARATOR     DW      ?
  186.  
  187.  
  188.  
  189. DAYS    LABEL   BYTE
  190.         DB      'Sun',TERMINATOR
  191.         DB      'Mon',TERMINATOR
  192.         DB      'Tue',TERMINATOR
  193.         DB      'Wed',TERMINATOR
  194.         DB      'Thu',TERMINATOR
  195.         DB      'Fri',TERMINATOR
  196.         DB      'Sat',TERMINATOR
  197.  
  198.  
  199. MONTHS          LABEL   BYTE
  200.         DB      'Jan',TERMINATOR
  201.         DB      'Feb',TERMINATOR
  202.         DB      'Mar',TERMINATOR
  203.         DB      'Apr',TERMINATOR
  204.         DB      'May',TERMINATOR
  205.         DB      'Jun',TERMINATOR
  206.         DB      'Jul',TERMINATOR
  207.         DB      'Aug',TERMINATOR
  208.         DB      'Sep',TERMINATOR
  209.         DB      'Oct',TERMINATOR
  210.         DB      'Nov',TERMINATOR
  211.         DB      'Dec',TERMINATOR
  212.  
  213. WORKSPACE       DB      64 DUP(?)
  214.  
  215. DSEG    ENDS
  216.  
  217.  
  218.  
  219.         SUBTTL  MACROS
  220.         PAGE
  221.  
  222.  
  223. PUTH    MACRO
  224.         PUSH    AX
  225.         MOV     AL,'H'
  226.         CALL    Stdout
  227.         POP     AX
  228.         ENDM
  229.  
  230.  
  231. PUTC    MACRO CHAR
  232.         PUSH    AX
  233.         MOV     AL,CHAR
  234.         CALL    Stdout
  235.         POP     AX
  236.         ENDM
  237.  
  238. CRLF    MACRO
  239.         PUSH    AX
  240.         MOV     AL,CR
  241.         CALL    Stdout
  242.         MOV     AL,LF
  243.         CALL    Stdout
  244.         POP     AX
  245.         ENDM
  246.  
  247. CLEAR_SCREEN MACRO
  248.         LOCAL   LABEL
  249.         PUSH    CX
  250.         PUSH    AX
  251.         MOV     CX,25
  252. LABEL:
  253.         MOV     AL,CR
  254.         CALL    Stdout
  255.         MOV     AL,LF
  256.         CALL    Stdout
  257.         LOOP    LABEL
  258.         POP     AX
  259.         POP     CX
  260.         ENDM
  261.  
  262.  
  263.  
  264.  
  265.         SUBTTL  Code segment begins here, at last
  266.         PAGE
  267.  
  268.  
  269. CSEG    SEGMENT PUBLIC PARA 'CODE'
  270.  
  271.         ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:NOTHING
  272.  
  273. MAIN    PROC    FAR
  274.  
  275.         PUSH    DS              ;has psp address
  276.         XOR     AX,AX
  277.         PUSH    AX              ;two pushes for far return to DOS
  278.  
  279.         ;save the psp segment
  280.  
  281.         MOV     DX,DS           ;save the psp
  282.  
  283.  
  284.         ;establish addressiblity to the data
  285.  
  286.         MOV     AX,SEG DSEG     ;get data segment address
  287.         MOV     DS,AX           ;make it our data segment
  288.         MOV     PSP,DX          ;save it in memory location also
  289.  
  290.  
  291.  
  292.         CLEAR_SCREEN            ;clear out the screen
  293.         CALL    DATENOW         ;print out startup message
  294.         CALL    TIMENOW         ;print out the current time
  295.         CRLF                    ;put in blank line
  296.         CALL    MOREPSP         ;tells more about PSP known items
  297.         CALL    PAGE_BREAK      ;page may be full, wait for user to see
  298.  
  299.         CALL    CURRENT_DRIVE   ;tells everything about the current drive
  300.         CALL    VERSION         ;tells you all about dos version #'s
  301.         CALL    BREAKST         ;^C break status
  302.         CALL    PAGE_BREAK      ;page is full, wait till user press's any key
  303.  
  304.         CALL    INTVEC_ADDRESS  ;show the interrupt handler addresses (dos)
  305.         CALL    INTVEC_PSP      ;shows the same from psp information
  306.         CALL    PAGE_BREAK      ;page is full, wait for user to say continue
  307.  
  308.         CALL    VERSION_RQT     ;see if the version is above 2.00
  309.         CALL    FILL_INFO       ;fill our structure with country information
  310.         CMP     AX,0            ;1 if it failed
  311.         JE      NEXT            ;if all is ok, continue
  312.         JMP     NODO            ;failed
  313. NEXT:                           ;get here if all goes well
  314.         CALL    HOLMES          ;holmes deciphers all into english.
  315.         JMP     GET_OUT         ;and exit program
  316. NODO:
  317.         LEA     DX,SORRY        ;show message of failure
  318.         CALL    STROUT          ;display message
  319.         JMP     GET_OUT         ;and exit program
  320.  
  321. GET_OUT:
  322.  
  323.         RET                     ;return to DOS
  324.  
  325. MAIN    ENDP
  326.  
  327.  
  328.         SUBTTL  print this string until a null is seen DISPZ
  329.         PAGE
  330.  
  331.         ;-------------------------------------------------------;
  332.         ; Procedure: DispZ                                      ;
  333.         ;       Will display to console the contents of an      ;
  334.         ;       asciiz string                                   ;
  335.         ;                                                       ;
  336.         ; Input:                                                ;
  337.         ;       DS:SI points to the asciiz string.              ;
  338.         ; Output:                                               ;
  339.         ;       Asciiz string printed on console.               ;
  340.         ;-------------------------------------------------------;
  341.  
  342. DISPZ   PROC NEAR
  343.  
  344.         PUSH    AX              ;save the registers
  345.         PUSH    SI
  346.  
  347.  
  348. DISPZ1:
  349.         LODSB                   ;get the first character
  350.         CMP     AL,0            ;is it the end of the string
  351.         JE      DISPZ_DONE      ;yes, it is get out
  352.         CALL    STDOUT          ;go display the character.
  353.         JMP     DISPZ1          ;repeat until null is found
  354.  
  355. DISPZ_DONE:
  356.         CRLF                    ;put a crlf pair
  357.  
  358.         POP     SI              ;restore those registers
  359.         POP     AX
  360.  
  361.         RET
  362.  
  363. DISPZ   ENDP
  364.  
  365.  
  366.  
  367.  
  368.         SUBTTL  deciphers the contents of ctry_info into english
  369.         PAGE
  370.  
  371.         ;-------------------------------------------------------;
  372.         ; Procedure: Holmes                                     ;
  373.         ;       The best around to do this kind of snooping     ;
  374.         ;       around.                                         ;
  375.         ; Input:                                                ;
  376.         ;       Works on ctry_info                              ;
  377.         ; Output:                                               ;
  378.         ;       Tells a lot about it in english onto the crt.   ;
  379.         ;-------------------------------------------------------;
  380.  
  381. HOLMES  PROC NEAR
  382.  
  383.         PUSH    AX              ;save callers registers
  384.         PUSH    DX
  385.         PUSH    SI
  386.  
  387.  
  388.         ;deal with the date/time format (word) first
  389.  
  390.         MOV     AX,DATE_TIME_FORMAT     ;tells some thing like
  391.         CMP     AX,0                    ;is if usa standard
  392.         JE      USALOC                  ;display usa msg
  393.         CMP     AX,1                    ;ok, the european format?
  394.         JE      EUROPELOC                       ;display europe format
  395.         CMP     AX,2                    ;ok, japanese format?
  396.         JE      JAPANLOC                ;display japan msg (in english)
  397.         LEA     DX,ERR1                 ;display, unknown country format
  398.         JMP     CTRY1                   ;go print it
  399. USALOC: LEA     DX,USA                  ;point to usa format
  400.         JMP     CTRY1                   ;go print it
  401. EUROPELOC:
  402.         LEA     DX,EUROPE               ;point to europe format
  403.         JMP     CTRY1                   ;go print it
  404. JAPANLOC:
  405.         LEA     DX,JAPAN                ;point to japan format
  406. CTRY1:  CALL    STROUT                  ;print it out
  407.  
  408.         ;deal with the currency symbol (5 bytes)
  409.  
  410.         LEA     DX,MSG30                ;point to heading string
  411.         CALL    STROUT                  ;print it out
  412.         LEA     SI,CURRENCY_SYMBOL      ;point to the symbol string
  413.         CALL    DISPZ                   ;this will display the string
  414.  
  415.  
  416.         ;display the thousands separator (2 bytes)
  417.  
  418.         LEA     DX,MSG31                ;point to the heading string
  419.         CALL    STROUT                  ;print the string out
  420.         LEA     SI,THOUSANDS_SEPARATOR  ;point to the string
  421.         CALL    DISPZ                   ;print it out
  422.  
  423.  
  424.         ;deal with the decimal separator (2 bytes)
  425.  
  426.         LEA     DX,MSG32                ;point to the heading string
  427.         CALL    STROUT                  ;print the string out
  428.         LEA     SI,DECIMAL_SEPARATOR    ;point to the string
  429.         CALL    DISPZ                   ;print it out
  430.  
  431.  
  432.         ;deal with the date separator   (2 bytes)
  433.  
  434.         LEA     DX,MSG33                ;point to the heading string
  435.         CALL    STROUT                  ;print the string out
  436.         LEA     SI,DATE_SEPARATOR       ;point to the string
  437.         CALL    DISPZ                   ;print it out
  438.  
  439.  
  440.  
  441.         ;deal with the time separator (2 bytes)
  442.  
  443.         LEA     DX,MSG34                ;point to the heading string
  444.         CALL    STROUT                  ;print the string out
  445.         LEA     SI,TIME_SEPARATOR       ;point to the string
  446.         CALL    DISPZ                   ;print it out
  447.  
  448.  
  449.  
  450.         ;deal with the currency places (1 byte)
  451.  
  452.         LEA     DX,MSG35                ;point to the header
  453.         CALL    STROUT                  ;print it out
  454.         MOV     AL,CURRENCY_PLACES      ;load it from its hiding place
  455.         ADD     AL,'0'                  ;make it ascii decimal
  456.         CALL    STDOUT                  ;print the digit out
  457.         CRLF                            ;put a cr/lf pair
  458.  
  459.  
  460.         ;deal with the time format (1 byte)
  461.  
  462.         LEA     DX,MSG36                ;point to the header
  463.         CALL    STROUT                  ;print the header to tty
  464.         MOV     AL,TIME_FORMAT          ;restore its value
  465.         CMP     AL,0                    ;is it 12 hour format?
  466.         JE      FMT12                   ;yes 12 hour one
  467.         CMP     AL,1                    ;is it 24 hour format?
  468.         JE      FMT24                   ;yes 24 hour one
  469.         LEA     DX,ERR1                 ;display error otherwise
  470.         JMP     TFMT_END                ;all meet here for printing
  471. FMT12:  LEA     DX,FORM12               ;set to 12 hour format line
  472.         JMP     TFMT_END                ;all meet here for printing
  473. FMT24:  LEA     DX,FORM24               ;set to 24 hour format line
  474. TFMT_END:
  475.         CALL    STROUT                  ;print the string out
  476.  
  477.  
  478.         ;deal with the data list separator (2 bytes)
  479.  
  480.         LEA     DX,MSG38                ;point to the heading string
  481.         CALL    STROUT                  ;print the string out
  482.         LEA     SI,DATA_LIST_SEPARATOR  ;point to the string
  483.         CALL    DISPZ                   ;print it out
  484.  
  485.  
  486.         ;deal with the case mapping call (4 bytes)
  487.  
  488.         LEA     DX,MSG37                ;point to the heading line
  489.         CALL    STROUT                  ;print the string
  490.         LEA     SI,CASE_MAPPING_CALL    ;get the address of variable
  491.         MOV     DX,WORD PTR [SI]        ;get the segment of the routine
  492.         CALL    TOHEX                   ;print it out in hex
  493.         MOV     DX,WORD PTR [SI+2]      ;get the offset addr of the routine
  494.         CALL    TOHEX                   ;print it in hex
  495.         PUTH                            ;put the H to make it hexidecimal
  496.         CRLF                            ;put a cr/lf pair
  497.  
  498.  
  499.         ;deal with the bitfield (1 byte)
  500.  
  501.         MOV     AH,BIT_FIELD            ;get the bitfield pattern
  502.         AND     AH,00000001B            ;is bit zero set
  503.         CMP     AH,00000001B            ;
  504.         JE      BIT0SET                 ;bit 0 is set
  505.         LEA     DX,BIT00                ;bit 0 is 0
  506.         JMP     NEXTBIT                 ;deal with the next bit
  507. BIT0SET:
  508.         LEA     DX,BIT01                ;bit 0 is 1
  509. NEXTBIT:
  510.         CALL    STROUT                  ;print the string out
  511.         MOV     AH,BIT_FIELD            ;recover the bit field
  512.         AND     AH,00000010B            ;is bit 1 set
  513.         CMP     AH,00000010B            ;
  514.         JE      BIT1SET                 ;bit 1 is 1
  515.         LEA     DX,BIT10                ;bit 1 is not set
  516.         JMP     ENDBIT                  ;end of this field
  517. BIT1SET:
  518.         LEA     DX,BIT11                ;bit 1 is set to 1
  519. ENDBIT:
  520.         CALL    STROUT                  ;print the string out
  521.  
  522.  
  523.         POP     SI              ;restore callers registers
  524.         POP     DX
  525.         POP     AX
  526.  
  527.         RET
  528.  
  529. HOLMES  ENDP
  530.  
  531.  
  532.  
  533.         SUBTTL  Fill the structure in dseg with country information
  534.         PAGE
  535.  
  536.         ;-------------------------------------------------------;
  537.         ; Procedure : Fill_Info                                 ;
  538.         ;       Fill the structure in dseg, ctry_info with the  ;
  539.         ;       values returned by dos.                         ;
  540.         ;                                                       ;
  541.         ; Input: None:                                          ;
  542.         ; Output: filled structure ctry_info                    ;
  543.         ;-------------------------------------------------------;
  544.  
  545. FILL_INFO       PROC NEAR
  546.  
  547.         PUSH    DX                      ;save callers registers
  548.  
  549.         CLC                             ;clear the carry flag
  550.  
  551.         MOV     AH,COUNTRYINFO          ;func to get country information
  552.         MOV     AL,0                    ;req in dos 2.00
  553.         LEA     DX,CTRY_INFO            ;this is where the 32bytes are going
  554.         INT     DOS
  555.  
  556.         JC      NOTOK                   ;if carry is set, we failed
  557.         XOR     AX,AX                   ;0 means its done
  558.         JMP     FILL_DONE               ;and return
  559. NOTOK:
  560.         MOV     AX,1                    ;1 means it failed
  561.         CLC                             ;clear the carry
  562.  
  563. FILL_DONE:
  564.  
  565.         POP     DX                      ;restore registers
  566.  
  567.         RET
  568. FILL_INFO       ENDP
  569.  
  570.  
  571.  
  572.         SUBTTL  For country_info need dos above 2.00, see if this is true
  573.         PAGE
  574.  
  575.  
  576.         ;-------------------------------------------------------;
  577.         ; Procedure: Version_rqt                                ;
  578.         ;       Determines if this is a version of dos above    ;
  579.         ;       2.00.  If it is not, it will display a message  ;
  580.         ;       to that effect.                                 ;
  581.         ;                                                       ;
  582.         ; Input:                                                ;
  583.         ;       Looks at Majvers and Minvers in the dseg        ;
  584.         ; Output:                                               ;
  585.         ;       If too low, will show message.                  ;
  586.         ;-------------------------------------------------------;
  587.  
  588. VERSION_RQT     PROC NEAR
  589.  
  590.         PUSH    AX                      ;save callers registers
  591.         PUSH    DX
  592.  
  593.  
  594.         LEA     DX,MSG29                ;point to heading string
  595.         CALL    STROUT                  ;print it out
  596.         CRLF                            ;put a blank line
  597.  
  598.         MOV     AH,MAJVERS              ;get the major version #
  599.         CMP     AH,2                    ;is it 2
  600.         JB      TOOLOW                  ;not even dos2.0
  601.         MOV     AH,MINVERS              ;get the minor version #
  602.         CMP     AH,0                    ;is it greater than 0
  603.         JNZ     OK                      ;if non zero, all is fine
  604. TOOLOW:
  605.         LEA     DX,ERRMSG               ;tell them they're too low !
  606.         CALL    STROUT                  ;print it out
  607.         CRLF                            ;print a blank line
  608. OK:
  609.         POP     DX                      ;restore the registers
  610.         POP     AX
  611.  
  612.         RET
  613.  
  614. VERSION_RQT     ENDP
  615.  
  616.  
  617.  
  618.         SUBTTL  Get interrupt handler addresses from DOS
  619.         PAGE
  620.  
  621.  
  622.  
  623.         ;-------------------------------------------------------;
  624.         ; Procedure: IntVec_Address                             ;
  625.         ;       Determines interrupt handler address locations  ;
  626.         ;       by asking dos.  Currently implemented for       ;
  627.         ;       vectors 20H - 24H                               ;
  628.         ;                                                       ;
  629.         ; Input:                                                ;
  630.         ;       None                                            ;
  631.         ; Output:                                               ;
  632.         ;       Interrupt handler addresses and prompts dis-    ;
  633.         ;       played on the console.                          ;
  634.         ;-------------------------------------------------------;
  635.  
  636. INTVEC_ADDRESS  PROC NEAR
  637.  
  638.         PUSH    AX                      ;save callers registers
  639.         PUSH    BX
  640.         PUSH    DX
  641.         PUSH    DI
  642.         PUSH    ES
  643.  
  644.         XOR     DI,DI                   ;intialize the counter
  645.         LEA     DX,MSG19                ;heading for what we're doing
  646.         CALL    STROUT                  ;print it to the console
  647.  
  648. INT_LOOP:
  649.         PUSH    DI                      ;save counter
  650.         SHL     DI,1                    ;offsets are two bytes long
  651.         MOV     DX,MSG_TABLE[DI]        ;get the appropriate msg for the int
  652.         CALL    STROUT                  ;print it to the console
  653.         POP     DI                      ;restore di to count
  654.         MOV     AX,0020H                ;intialize to base counter
  655.         ADD     AX,DI                   ;that is the int handler of interest
  656.         PUSH    AX                      ;save this counter.
  657.         MOV     AH,GETINTVEC            ;dos func# for int handler address
  658.         INT     DOS                     ;ask dos to get it
  659.         MOV     DX,ES                   ;that's the interrupt segment address
  660.         CALL    TOHEX                   ;print it out.
  661.         MOV     DX,BX                   ;that's the interrupt offset address
  662.         CALL    TOHEX                   ;print it out
  663.         PUTH                            ;to denote its hex
  664.         CRLF                            ;and lets go to the next line
  665.  
  666.         INC     DI                      ;increment counter
  667.         POP     AX                      ;restore register for comparision
  668.         CMP     AL,24H                  ;are we done yet?
  669.         JNE     INT_LOOP                ;no, so repeat it
  670.  
  671.         POP     ES
  672.         POP     DI
  673.         POP     DX
  674.         POP     BX
  675.         POP     AX
  676.  
  677.         RET
  678. INTVEC_ADDRESS  ENDP
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.         SUBTTL  Get interrupt handler addresses from the PSP
  686.         PAGE
  687.  
  688.  
  689.         ;-------------------------------------------------------;
  690.         ; Procedure Intvec_Psp                                  ;
  691.         ;       Gets the location of interrupt handlers by      ;
  692.         ;       peeking around the PSP.  Currently implemented  ;
  693.         ;       for interrupts: 20H, 23H, and 24H               ;
  694.         ;                                                       ;
  695.         ; Input:                                                ;
  696.         ;       reads memory variable PSP for PSP segment addr. ;
  697.         ; Output:                                               ;
  698.         ;       outputs handler addresses to the console.       ;
  699.         ;-------------------------------------------------------;
  700.  
  701. INTVEC_PSP      PROC NEAR
  702.  
  703.         PUSH    AX              ;save callers registers
  704.         PUSH    DX
  705.         PUSH    SI
  706.         PUSH    ES
  707.  
  708.         MOV     ES,PSP
  709.         CRLF                    ;add some spacing
  710.         LEA     DX,MSG25        ;point to the next message
  711.         CALL    STROUT          ;print that string out
  712.  
  713.         LEA     DX,MSG26        ;point to next message
  714.         CALL    STROUT          ;print the string out
  715.         MOV     SI,PGMTERMINATE ;offset in psp of int handler location
  716.         MOV     DX,ES:WORD PTR[SI+2]    ;get that word segment
  717.         CALL    TOHEX           ;print it out in hex
  718.         MOV     DX,ES:WORD PTR[SI]      ;get the word offset
  719.         CALL    TOHEX           ;print it out in hex
  720.         PUTH                    ;put h to denote hex
  721.         CRLF                    ;put cr/lf character
  722.  
  723.         LEA     DX,MSG27        ;point to next message
  724.         CALL    STROUT          ;print the string out
  725.         MOV     SI,CONTROL_C    ;offset in psp of int handler location
  726.         MOV     DX,ES:WORD PTR[SI+2]    ;get that word segment
  727.         CALL    TOHEX           ;print it out in hex
  728.         MOV     DX,ES:WORD PTR[SI]      ;get the word offset
  729.         CALL    TOHEX           ;print it out in hex
  730.         PUTH                    ;put h to denote hex
  731.         CRLF                    ;put cr/lf character
  732.  
  733.         LEA     DX,MSG28        ;point to next message
  734.         CALL    STROUT          ;print the string out
  735.         MOV     SI,CRITICAL     ;offset in psp of int handler location
  736.         MOV     DX,ES:WORD PTR[SI+2]    ;get that word segment
  737.         CALL    TOHEX           ;print it out in hex
  738.         MOV     DX,ES:WORD PTR[SI]      ;get the word offset
  739.         CALL    TOHEX           ;print it out in hex
  740.         PUTH                    ;put h to denote hex
  741.         CRLF                    ;put cr/lf character
  742.  
  743.         POP     ES              ;restore callers register
  744.         POP     SI
  745.         POP     DX
  746.         POP     AX
  747.         RET
  748.  
  749. INTVEC_PSP      ENDP
  750.  
  751.  
  752.  
  753.         SUBTTL  Procedure BreakSt
  754.         PAGE
  755.  
  756.  
  757.         ;-------------------------------------------------------;
  758.         ;Procedure: BreakSt                                     ;
  759.         ;       Determines ^C break status                      ;
  760.         ;IN:                                                    ;
  761.         ;       None                                            ;
  762.         ;OUT:                                                   ;
  763.         ;       Prints on/off to the console                    ;
  764.         ;-------------------------------------------------------;
  765.  
  766. BREAKST PROC NEAR
  767.  
  768.         PUSH    AX              ;save callers registers
  769.         PUSH    DX              ;
  770.  
  771.         LEA     DX,MSG18        ;ready to print out ^C check prompt
  772.         CALL    STROUT          ;print it out
  773.         MOV     AH,CTRLCHECK    ;dos func # for ^C check
  774.         XOR     AL,AL           ;requesting only
  775.         INT     DOS             ;ask dos
  776.         CMP     DL,0            ;is ^C check off
  777.         JZ      COFF            ;^c check is off
  778.         LEA     DX,ON           ;otherwise it is on
  779.         JMP     CMEET           ;print it
  780. COFF:   LEA     DX,OFF          ;^C check is off
  781. CMEET:  CALL    STROUT          ;print out the result
  782.  
  783.         POP     DX              ;restore caller registers
  784.         POP     AX
  785.  
  786.         RET
  787.  
  788. BREAKST ENDP
  789.  
  790.  
  791.  
  792.  
  793.         SUBTTL  Procedure Version
  794.         PAGE
  795.  
  796.  
  797.         ;-------------------------------------------------------;
  798.         ; Procedure: Version                                    ;
  799.         ;       Gets the dos version #'s                        ;
  800.         ; IN:                                                   ;
  801.         ;       Nothing                                         ;
  802.         ; OUT:                                                  ;
  803.         ;       Prints out major,minor,oem,user #'s, and stores ;
  804.         ;       major and minor #'s into DSEG:MajVers and       ;
  805.         ;       DSEG:MinVers                                    ;
  806.         ;-------------------------------------------------------;
  807.  
  808. VERSION PROC NEAR
  809.  
  810.         PUSH    AX                      ;save callers registers
  811.         PUSH    BX
  812.         PUSH    CX
  813.         PUSH    DX
  814.  
  815.         MOV     AH,GETVERSION           ;dos funciton to get version #
  816.         INT     DOS                     ;tell dos to do it
  817.                                         ;al = major version
  818.                                         ;ah = minor version
  819.                                         ;bh = oem number
  820.                                         ;bl:cx = user # (24 bits)
  821.         ; print the version #'s
  822.  
  823.         MOV     MAJVERS,AL              ;save major version #
  824.         MOV     MINVERS,AH              ;save minor version #
  825.         LEA     DX,MSG15                ;dos version #
  826.         CALL    STROUT                  ;print banner
  827.         MOV     DL,AL                   ;move character to convert to decimal
  828.         CALL    ToDec                   ;convert to decimal
  829.         PUTC    '.'                     ;put the holy period
  830.         MOV     DL,AH                   ;print the minor part
  831.         CMP     DL,09                   ;need preceeding 0 if needed
  832.         JA      NOZERO                  ;don't need a zero
  833.         PUTC    '0'                     ;put in a zero
  834. NOZERO: CALL    ToDec                   ;convert to decimal and print
  835.         CRLF                            ;put CRLF pair
  836.  
  837.         ;print the oem number
  838.  
  839.         LEA     DX,MSG16                ;print oem # banner
  840.         CALL    STROUT                  ;print it out
  841.         MOV     DL,BH                   ;get the oem #
  842.         CALL    TODEC                   ;print it out in decimal
  843.         CRLF                            ;put a cr/lf pair
  844.  
  845.  
  846.         ;print the user number
  847.  
  848.         LEA     DX,MSG17                ;print user # banner
  849.         CALL    STROUT                  ;print the banner out
  850.         XOR     DH,DH                   ;zero out the top
  851.         MOV     DL,BL                   ;bl:cx has user number
  852.         CALL    TOHEX                   ;print the bl portion
  853.         MOV     DX,CX                   ;print the lower portion
  854.         CALL    TOHEX                   ;print the cx portion
  855.         PUTH                            ;put the H for hex notation
  856.         CRLF                            ;put a cr/lf pair
  857.  
  858.         POP     DX                      ;restore user registers
  859.         POP     CX
  860.         POP     BX
  861.         POP     AX
  862.  
  863.         RET
  864.  
  865. VERSION ENDP
  866.  
  867.  
  868.  
  869.  
  870.         SUBTTL  Procedure CalcDisk
  871.         PAGE
  872.  
  873.  
  874.         ;-------------------------------------------------------;
  875.         ; Procedure: CalcDisk                                   ;
  876.         ;       Calculates diskspace free and total available   ;
  877.         ; IN:                                                   ;
  878.         ;       AX - sectors/clusters                           ;
  879.         ;       BX - available clusters                         ;
  880.         ;       CX - bytes per sector                           ;
  881.         ;       DX - clusters per drive                         ;
  882.         ;                                                       ;
  883.         ; OUT:                                                  ;
  884.         ;       DSEG:USED DD has used diskspace figure          ;
  885.         ;       DSEG:FREE DD has free diskspace figure          ;
  886.         ;       DSEG:TOTAL DD has total diskspace on disk       ;
  887.         ;-------------------------------------------------------;
  888.  
  889. CALCDISK PROC NEAR
  890.  
  891.  
  892.         PUSH    AX              ;save all registers
  893.         PUSH    BX              ;
  894.         PUSH    CX
  895.         PUSH    DX
  896.         PUSH    SI
  897.  
  898.         MOV     SI,DX           ;copy total
  899.         SUB     SI,BX           ;used = total - free
  900.         PUSH    DX              ;temporary save, total
  901.         PUSH    BX              ;available
  902.  
  903.  
  904.         MOV     BX,CX           ;common part, bytes/cluster computed
  905.         XOR     DX,DX           ;don't need top, AX->sectors/cluster
  906.         MUL     BX              ;sect/clust x bytes/sector=bytes/clust
  907.         MOV     TOTAL_1,DX      ;save bytes/clust
  908.         MOV     TOTAL_2,AX      ;
  909.         MOV     USED_1,DX       ;
  910.         MOV     USED_2,AX       ;
  911.         POP     BX              ;restore available clusters
  912.         MUL     BX              ;bytes/clust * avail clust=free_sp
  913.         MOV     FREE_1,DX       ;free disk space msw
  914.         MOV     FREE_2,AX       ;free disk space lsw
  915.         POP     BX              ;pop clusters/drive
  916.         MOV     DX,TOTAL_1      ;restore bytes/cluster
  917.         MOV     AX,TOTAL_2      ;
  918.         MUL     BX              ;bytes/cluster*# clusters on drive=avail
  919.         MOV     TOTAL_1,DX      ;max space on disk msw
  920.         MOV     TOTAL_2,AX      ;max space on disk lsw
  921.         MOV     DX,USED_1       ;restore bytes/cluster
  922.         MOV     AX,USED_2       ;
  923.         MOV     BX,SI           ;# of clusters used
  924.         MUL     BX              ;bytes/cluster x #clusters used = used
  925.         MOV     USED_1,DX       ;save this information, msw
  926.         MOV     USED_2,AX       ;lsw.
  927.  
  928.         POP     SI              ;restore all registers
  929.         POP     DX              ;restore all registers
  930.         POP     CX
  931.         POP     BX
  932.         POP     AX
  933.  
  934.         RET
  935.  
  936. CALCDISK ENDP
  937.  
  938.  
  939.  
  940.  
  941.  
  942.         SUBTTL Procedure Current_Drive
  943.         PAGE
  944.  
  945.  
  946.  
  947.         ;-------------------------------------------------------;
  948.         ;Procedure: Current_Drive                               ;
  949.         ;       Tells everything about the drive (current)      ;
  950.         ;In:                                                    ;
  951.         ;       None.                                           ;
  952.         ;Out:                                                   ;
  953.         ;       Stores current drive # in Dseg:Curdriv          ;
  954.         ;-------------------------------------------------------;
  955.  
  956. CURRENT_DRIVE   PROC NEAR
  957.  
  958.  
  959.         PUSH    AX              ;save callers registers
  960.         PUSH    BX              ;save caller's registers
  961.         PUSH    CX
  962.         PUSH    DX
  963.         PUSH    SI
  964.  
  965.         ;Get the current drive number  A=0, B=1 and store it in memory
  966.  
  967.         LEA     DX,MSG4                 ;tell the world which drive is current
  968.         CALL    Strout                  ;print the prompt
  969.         MOV     AH,CurrDisk             ;func # for current disk information
  970.         INT     DOS                     ;tell dos
  971.         MOV     CURDRIV,AL              ;save drive number
  972.         ADD     AL,'A'                  ;make drive ascii
  973.         PUTC    AL                      ;print drive letter
  974.         PUTC    ':'                     ;and the colon
  975.         CRLF                            ;and go to the next line
  976.  
  977.         ;Print the current directory name
  978.  
  979.         LEA     DX,MSG5                 ;prompt for current directory
  980.         CALL    Strout                  ;print the prompt
  981.         MOV     AH,CDIR                 ;func to get text of current directory
  982.         LEA     SI,Workspace            ;point to 64 byte area
  983.         MOV     DL,CURDRIV              ;that's the drive of interest
  984.         INC     DL                      ;dos wants it 1=a,....
  985.         INT     DOS                     ;tell dos to do it
  986.  
  987.         JC      Failed                  ;could not do it
  988.  
  989.         LEA     SI,Workspace            ;point to the begining
  990.         PUTC    '\'                     ;that is not usually given by dos
  991.  
  992. CD1:
  993.         MOV     AL,BYTE PTR[SI]         ;get a byte
  994.         CMP     AL,0                    ;is it the end of the string?
  995.         JE      CDONE                   ;  yes, then quit
  996.         CALL    Stdout                  ;otherwise print the character
  997.         INC     SI                      ;point to next character
  998.         JMP     CD1
  999.  
  1000.  
  1001. FAILED:
  1002.         LEA     DX,SORRY                ;point to fail message
  1003.         CALL    Strout                  ;print it out
  1004.  
  1005. CDONE:  CRLF                            ;terminate with cr/lf pair
  1006.  
  1007.  
  1008.         ;Print number of logical drives dos knows system has
  1009.  
  1010.         LEA     DX,MSG6                 ;prompt for number of drives
  1011.         CALL    Strout                  ;print the prompt
  1012.         MOV     AH,LOGDISK              ;log drive function
  1013.         MOV     DL,CURDRIV              ;move curdrive as drive to log on to
  1014.         INT     DOS                     ;tell dos to do it
  1015.         MOV     DL,AL                   ;# drives attached moved to dl
  1016.         CALL    TODEC                   ;print it out in decimal
  1017.         CRLF                            ;place cr/lf pair
  1018.  
  1019.  
  1020.         ;Print some information on logged drive
  1021.         LEA     DX,MSG7                 ;banner for things following
  1022.         CALL    STROUT                  ;print out the banner
  1023.         LEA     DX,MSG8                 ;# of avail clusters banner
  1024.         CALL    STROUT                  ;print it out
  1025.         MOV     AH,DISKSPACE            ;func for free disk space
  1026.         XOR     DL,DL                   ;about the current drive
  1027.         INT     DOS                     ;ax= sec/cluster
  1028.                                         ;bx= avail clusters
  1029.                                         ;cx= bytes per drive
  1030.                                         ;dx = clusters per drive
  1031.         CALL    CALCDISK                ;calculate freespace and max disk space
  1032.  
  1033.         ;display # of free clusters on drive
  1034.  
  1035.         PUSH    DX                      ;save dx
  1036.         MOV     DX,BX                   ;get ready to print in hex
  1037.         CALL    TOHEX                   ;print avail clusters
  1038.         PUTH                            ;put H to represent Hexadecimal notation
  1039.         CRLF                            ;print cr/lf pair
  1040.  
  1041.         ;display # clusters (total) on drive
  1042.  
  1043.         LEA     DX,MSG9                 ;# clusters / drive msg
  1044.         CALL    STROUT                  ;print it out
  1045.         POP     DX                      ;this has it
  1046.         CALL    TOHEX                   ;print it out
  1047.         PUTH                            ;print H to represent Hex notation
  1048.         CRLF                            ;print cr/lf pair
  1049.  
  1050.         ;display # bytes / sector on drive
  1051.  
  1052.         LEA     DX,MSG10                ;# bytes / sector message
  1053.         CALL    STROUT                  ;print it out
  1054.         MOV     DX,CX                   ;ready to print in hex
  1055.         CALL    ToHex                   ;print it out
  1056.         PUTH                            ;print H to represent Hex notation
  1057.         CRLF                            ;print cr/lf pair
  1058.  
  1059.         ;display # sectors/cluster on drive
  1060.  
  1061.         LEA     DX,MSG11                ;# of sectors / cluster
  1062.         CALL    STROUT                  ;print out message
  1063.         MOV     DX,AX                   ;ready to print in hex
  1064.         CALL    TOHEX                   ;print in hex
  1065.         PUTH                            ;print H to represent Hex notation
  1066.         CRLF                            ;print cr/lf pair
  1067.  
  1068.         ;bytes used up on current disk
  1069.  
  1070.         LEA     DX,MSG12                ;bytes used on drive
  1071.         CALL    STROUT                  ;print out the message
  1072.         MOV     DX,USED_1               ;print msw
  1073.         CALL    TOHEX                   ;print msw in hex
  1074.         MOV     DX,USED_2               ;print lsw
  1075.         CALL    TOHEX                   ;print lsw in hex
  1076.         PUTH                            ;print H to represent Hex notation
  1077.         CRLF                            ;print cr/lf pair
  1078.  
  1079.         ; bytes remaining on disk
  1080.  
  1081.         LEA     DX,MSG13                ;remaining diskspace
  1082.         CALL    STROUT                  ;print message
  1083.         MOV     DX,FREE_1               ;the msw is ready
  1084.         CALL    TOHEX                   ;print it in hex
  1085.         MOV     DX,FREE_2               ;the lsw is ready
  1086.         CALL    TOHEX                   ;print the lsw
  1087.         PUTH                            ;print H to represent Hex notation
  1088.         CRLF                            ;print pair of cr/lf
  1089.  
  1090.         ; bytes in total supported by disk
  1091.  
  1092.         LEA     DX,MSG13A               ;total drive capacity message
  1093.         CALL    STROUT                  ;print message
  1094.         MOV     DX,TOTAL_1              ;print msw
  1095.         CALL    TOHEX                   ;in hex
  1096.         MOV     DX,TOTAL_2              ;print lsw
  1097.         CALL    TOHEX                   ;in hex
  1098.         PUTH                            ;print H to represent Hex notation
  1099.         CRLF                            ;print cr/lf pair
  1100.  
  1101.  
  1102.         ;display status of verify after write
  1103.         ;0 is off and 1 is on
  1104.  
  1105.         LEA     DX,MSG14                ;verify status message
  1106.         CALL    STROUT                  ;print the message
  1107.         MOV     AH,VERIFY               ;dos status chk func for verify
  1108.         INT     DOS                     ;ask dos to check it
  1109.         CMP     AL,0                    ;is the flag off
  1110.         JZ      ISOFF                   ;is off
  1111.         LEA     DX,ON                   ;is on
  1112.         JMP     PR1                     ;get ready to print
  1113. ISOFF:  LEA     DX,OFF                  ;is off
  1114. PR1:    CALL    STROUT                  ;print out the message
  1115.  
  1116.  
  1117.         POP     SI                      ;restore caller's registers,
  1118.         POP     DX
  1119.         POP     CX
  1120.         POP     BX
  1121.         POP     AX
  1122.  
  1123.         RET
  1124.  
  1125. CURRENT_DRIVE   ENDP
  1126.  
  1127.  
  1128.  
  1129.         SUBTTL  Shows the contents of environment area
  1130.         PAGE
  1131.  
  1132.  
  1133.         ;-------------------------------------------------------;
  1134.         ; Procedure Showenv                                     ;
  1135.         ;       Displays the environment variables currently    ;
  1136.         ;       set onto the console.                           ;
  1137.         ;                                                       ;
  1138.         ; Input:                                                ;
  1139.         ;       Looks at the variable ENV                       ;
  1140.         ;       that is set by MorePsp.                         ;
  1141.         ; Output:                                               ;
  1142.         ;       Displays the environment variable strings onto  ;
  1143.         ;       the console.                                    ;
  1144.         ;-------------------------------------------------------;
  1145.  
  1146. SHOWENV PROC NEAR
  1147.  
  1148.         PUSH    AX              ;save callers registers
  1149.         PUSH    DX
  1150.         PUSH    SI
  1151.         PUSH    DS
  1152.  
  1153.         CRLF                    ;skip a line
  1154.         LEA     DX,MSG2A        ;display a message
  1155.         CALL    STROUT          ;print it out
  1156.         CRLF                    ;skip a line
  1157.         PUTC    TAB             ;tab one field
  1158.  
  1159.         MOV     SI,ENV          ;point to the Env segment
  1160.         MOV     DS,SI           ;and ready to start at the top
  1161.         XOR     SI,SI
  1162.  
  1163. ENVLP1:
  1164.         LODSB                   ;get a character from Envsegment
  1165.         CMP     AL,0            ;is it the end of the string?
  1166.         JE      STRING_END      ;if yes, place a cr/lf
  1167. ENVLP2:
  1168.         CALL    STDOUT          ;if not, print the character out
  1169.         JMP     ENVLP1          ;get the next character
  1170.  
  1171. STRING_END:                     ;end of one string
  1172.  
  1173.         CRLF                    ;put a cr/lf pair
  1174.         LODSB                   ;get the next character
  1175.         CMP     AL,0            ;are we done?
  1176.         JZ      FIN             ;if yes, scram
  1177.         PUTC    TAB             ;otherwise, tab one field
  1178.         JMP     ENVLP2          ;if not, print the character out and loop
  1179.  
  1180. FIN:                            ;yes, we are done
  1181.         CRLF                    ;add some spacing
  1182.         POP     DS              ;restore things to normal
  1183.         POP     SI
  1184.         POP     DX
  1185.         POP     AX
  1186.  
  1187.         RET
  1188.  
  1189. SHOWENV ENDP
  1190.  
  1191.  
  1192.  
  1193.         ;-------------------------------------------------------;
  1194.         ; Procedure Showmem                                     ;
  1195.         ;       Displays the knowledge of psp on the topic of   ;
  1196.         ;       memory.                                         ;
  1197.         ;                                                       ;
  1198.         ; Input:                                                ;
  1199.         ;       Looks at the variable PSP                       ;
  1200.         ;       that is set by main program                     ;
  1201.         ; Output:                                               ;
  1202.         ;       Displays the memory information.                ;
  1203.         ;-------------------------------------------------------;
  1204.  
  1205. SHOWMEM PROC NEAR
  1206.  
  1207.         PUSH    AX              ;save callers registers
  1208.         PUSH    BX
  1209.         PUSH    DX
  1210.         PUSH    ES
  1211.  
  1212.  
  1213.         CRLF                    ;skip a line
  1214.         LEA     DX,MSG3A        ;display a message
  1215.         CALL    STROUT          ;print it out
  1216.  
  1217.         ;get the parameters from the psp
  1218.  
  1219.         MOV     AX,PSP          ;get the psp segment value
  1220.         MOV     ES,AX           ;es points to psp segment
  1221.         MOV     MEMBOT,AX       ;psp is bot of memory for exe files, CS for COM
  1222.         MOV     DX,ES:WORD PTR [2]      ;get the word at offset 2 in psp
  1223.         MOV     MEMTOP,DX       ;which is top of memory in para form
  1224.  
  1225.  
  1226.         ;display information on total memory
  1227.  
  1228.         PUTC    '<'             ;put the angle bracket
  1229.         MOV     DX,MEMTOP       ;total memory in para form
  1230.         CALL    TOHEX           ;convert to hex and display
  1231.         PUTH                    ;make it known it is in hex
  1232.         PUTC    '>'             ;put closing angle bracket
  1233.         PUTC    TAB             ;some space
  1234.         MOV     AX,MEMTOP       ;get ready to multiply
  1235.         XOR     DX,DX           ;will be upper byte
  1236.         MOV     BX,10H          ;multiply by 16
  1237.         MUL     BX              ;dx = msw, ax = lsw
  1238.         CALL    TOHEX           ;print most significant word first
  1239.         MOV     DX,AX           ;print the lsw now
  1240.         CALL    TOHEX           ;print it
  1241.         PUTH                    ;make it known it is in hex
  1242.         LEA     DX,MSG3D        ;add label
  1243.         CALL    STROUT          ;print the label
  1244.         CRLF                    ;skip line
  1245.  
  1246.         ;display information on memory currently used
  1247.  
  1248.         CRLF                    ;skip a line
  1249.         LEA     DX,MSG3B        ;display a message
  1250.         CALL    STROUT          ;print it out
  1251.  
  1252.  
  1253.         ;display information on memory used
  1254.  
  1255.         PUTC    '<'             ;put the angle bracket
  1256.         MOV     DX,MEMBOT       ;used memory in para form
  1257.         CALL    TOHEX           ;convert to hex and display
  1258.         PUTH                    ;make it known it is in hex
  1259.         PUTC    '>'             ;put closing angle bracket
  1260.         PUTC    TAB             ;some space
  1261.         MOV     AX,MEMBOT       ;get ready to multiply
  1262.         XOR     DX,DX           ;will be upper byte
  1263.         MOV     BX,10H          ;multiply by 16
  1264.         MUL     BX              ;dx = msw, ax = lsw
  1265.         CALL    TOHEX           ;print most significant word first
  1266.         MOV     DX,AX           ;print the lsw now
  1267.         CALL    TOHEX           ;print it
  1268.         PUTH                    ;make it known it is in hex
  1269.         LEA     DX,MSG3D        ;add label
  1270.         CALL    STROUT          ;print the label
  1271.         CRLF                    ;skip line
  1272.  
  1273.  
  1274.         ;display information on memory FREE
  1275.  
  1276.         CRLF                    ;skip a line
  1277.         LEA     DX,MSG3C        ;display a message
  1278.         CALL    STROUT          ;print it out
  1279.  
  1280.  
  1281.         ;display information on memory FREE
  1282.  
  1283.         PUTC    '<'             ;put the angle bracket
  1284.         MOV     DX,MEMTOP       ;total memory in para form
  1285.         SUB     DX,MEMBOT       ;subtract memory used in para form, still
  1286.         PUSH    DX              ;save this itsy bit of info
  1287.         CALL    TOHEX           ;convert to hex and display
  1288.         PUTH                    ;make it known it is in hex
  1289.         PUTC    '>'             ;put closing angle bracket
  1290.         PUTC    TAB             ;some space
  1291.         POP     AX              ;recover the itsy bit of info
  1292.         XOR     DX,DX           ;will be upper byte
  1293.         MOV     BX,10H          ;multiply by 16
  1294.         MUL     BX              ;dx = msw, ax = lsw
  1295.         CALL    TOHEX           ;print most significant word first
  1296.         MOV     DX,AX           ;print the lsw now
  1297.         CALL    TOHEX           ;print it
  1298.         PUTH                    ;make it known it is in hex
  1299.         LEA     DX,MSG3D        ;add label
  1300.         CALL    STROUT          ;print the label
  1301.         CRLF                    ;skip line
  1302.  
  1303.         POP     ES
  1304.         POP     DX              ;restore the users registers
  1305.         POP     BX
  1306.         POP     AX
  1307.  
  1308.         RET
  1309.  
  1310. SHOWMEM ENDP
  1311.  
  1312.  
  1313.  
  1314.         SUBTTL  PSP knows all these things, MOREPSP routine
  1315.         PAGE
  1316.  
  1317.  
  1318.         ;-------------------------------------------------------;
  1319.         ;Procedure: MorePsp                                     ;
  1320.         ;       Tells what the PSP has.                         ;
  1321.         ;In:                                                    ;
  1322.         ;       Psp variable has the psp segment address        ;
  1323.         ;Out:                                                   ;
  1324.         ;       None                                            ;
  1325.         ;-------------------------------------------------------;
  1326.  
  1327. MOREPSP PROC    NEAR
  1328.  
  1329.         PUSH    DX              ;save callers registers
  1330.         PUSH    DI
  1331.         PUSH    DS
  1332.  
  1333.  
  1334.         LEA     DX,MSG1         ;psp segment address message
  1335.         CALL    Strout          ;print out the message to console
  1336.         MOV     DX,PSP          ;restore Psp segment address
  1337.         CALL    TOHEX           ;print out psp segment in hex to console
  1338.         PUTH                    ;print H to represent Hex notation
  1339.         CRLF                    ;carriage return/linefeed
  1340.  
  1341.         LEA     DX,MSG2         ;message for the environment area
  1342.         CALL    Strout          ;print out the message
  1343.         MOV     DI,PSP          ;restore psp segment address
  1344.         PUSH    DS              ;save the data segment
  1345.         MOV     DS,DI           ;switch segments to PSP
  1346.         MOV     DI,ENVAREA      ;point to offset in psp where envarea is stored
  1347.         MOV     DX,[DI]         ;dx should have segment address of envarea
  1348.         POP     DS              ;restore the data segment
  1349.         MOV     ENV,DX          ;env now has that envarea segment
  1350.         CALL    ToHex           ;print the address of envarea out
  1351.         PUTH                    ;print H to represent Hex notation
  1352.         CRLF                    ;carriage return/linefeed
  1353.  
  1354.         CALL    SHOWENV         ;show the contents of the environment area
  1355.  
  1356.  
  1357.         LEA     DX,MSG3         ;message for #bytes left in current segment
  1358.         CALL    Strout          ;print the message
  1359.         MOV     DI,PSP          ;restore psp segment address
  1360.         PUSH    DS              ;save current data segment
  1361.         MOV     DS,DI           ;switch to psp
  1362.         MOV     DI,SEGLEFT      ;point into psp:segleft area
  1363.         MOV     DX,[DI]         ;return word at that offset
  1364.         POP     DS              ;restore the data segment
  1365.         CALL    ToHex           ;and print it out
  1366.         PUTH                    ;print H to represent Hex notation
  1367.         CRLF                    ;carriage return/linefeed
  1368.  
  1369.         CALL    SHOWMEM         ;show psp and its knowledge of memory
  1370.  
  1371.         POP     DS              ;restore caller's registers
  1372.         POP     DI
  1373.         POP     DX
  1374.  
  1375.         RET
  1376.  
  1377. MOREPSP ENDP
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.         SUBTTL  ROUTINE DATENOW
  1384.         PAGE
  1385.  
  1386.  
  1387.         ;-------------------------------------------------------;
  1388.         ; Procedure: DateNow                                    ;
  1389.         ;       Prints out msg0 and the current date and time   ;
  1390.         ;-------------------------------------------------------;
  1391.  
  1392. DATENOW PROC    NEAR
  1393.  
  1394.         PUSH    AX      ;save callers registers
  1395.         PUSH    CX
  1396.         PUSH    DX
  1397.         PUSH    SI
  1398.  
  1399.         LEA     DX,Msg0         ;print the start time message
  1400.         CALL    Strout
  1401.  
  1402.         MOV     AH,Getdate      ;getdate func
  1403.         INT     DOS
  1404.         PUSH    CX              ;save year
  1405.         PUSH    DX              ;save month and date
  1406.         MOV     CL,2            ;since each entry in jmp tble is 4 bytes
  1407.         SHL     AL,CL           ;every entry in descrip table is 4bytes
  1408.         XOR     AH,AH           ;don't need top
  1409.         MOV     SI,AX           ;move day into si (0=sun => 4th byte = 'sun')
  1410.         LEA     DX,DAYS[SI]     ;point to verbal description of day and
  1411.         CALL    Strout          ;print it out
  1412.         PUTC    ' '             ;insert a blank
  1413.         POP     DX              ;restore the month and date
  1414.         PUSH    DX              ;still need it later
  1415.         MOV     AL,DH           ;get the month
  1416.         SUB     AL,1            ;months start from 1, need initial to be 0
  1417.         MOV     CL,2            ;each entry in table is 4 bytes long.
  1418.         SHL     AL,CL           ;so multiply by four
  1419.         XOR     AH,AH
  1420.         MOV     SI,AX           ;point to verbal description of month
  1421.         LEA     DX,MONTHS[SI]   ;make dx point to the verbal description
  1422.         CALL    Strout          ;print it out
  1423.         PUTC    ' '             ;insert a blank
  1424.         POP     DX              ;restore month and date
  1425.         XOR     DH,DH           ;don't need the month
  1426.         CALL    ToDec           ;get the date and convert it
  1427.         PUTC    ','             ;insert a comma
  1428.         PUTC    ' '             ;insert a space
  1429.         POP     CX              ;restore the year
  1430.         MOV     DX,CX           ;print out the YEAR
  1431.         CALL    ToDECW
  1432.  
  1433.  
  1434.         POP     SI
  1435.         POP     DX
  1436.         POP     CX
  1437.         POP     AX
  1438.  
  1439.         RET
  1440.  
  1441. DATENOW ENDP
  1442.  
  1443.  
  1444.         SUBTTL  Tells the time
  1445.         PAGE
  1446.  
  1447.  
  1448. TIMENOW PROC    NEAR
  1449.         ;-----------------------------------------------;
  1450.         ; PROCEDURE:  TIMENOW                           ;
  1451.         ;        This procedure prints out the ascii    ;
  1452.         ; translation of time onto the console.         ;
  1453.         ;-----------------------------------------------;
  1454.  
  1455.         PUSH    AX              ;save the caller's registers
  1456.         PUSH    CX
  1457.         PUSH    DX
  1458.  
  1459.  
  1460.         PUTC    ' '             ;put some spaces
  1461.         PUTC    ' '             ;
  1462.         PUTC    ' '             ;
  1463.         PUTC    ' '             ;
  1464.         PUTC    ' '             ;
  1465.         MOV     AH,2CH          ;time function for DOS
  1466.         INT     DOS             ;get the time
  1467.  
  1468.         ;move the month into register DL, for conversion to decimal
  1469.         MOV     AL,DL           ;save the hundreths.
  1470.         MOV     DL,CH           ;thats the hour
  1471.         CALL    TODEC           ;convert to decimal and write to screen
  1472.         PUTC    ':'             ;put in the separator
  1473.         MOV     DL,CL           ;thats the minutes
  1474.         CALL    TODEC           ;convert minutes to decimal and write it out
  1475.         PUTC    ':'             ;put in the separator
  1476.         MOV     DL,DH           ;thats the seconds
  1477.         CALL    TODEC           ;convert seconds to decimal and write it out
  1478.         PUTC    '.'             ;put the separator in
  1479.         MOV     DL,AL           ;restore the hundreths of a second
  1480.         CALL    TODEC           ;convert hundreths to decimal and write it out
  1481.         CRLF                    ;Put a cr/lf
  1482.  
  1483.         POP     DX              ;restore caller's registers
  1484.         POP     CX
  1485.         POP     AX
  1486.  
  1487.         RET
  1488.  
  1489. TIMENOW ENDP
  1490.  
  1491.         SUBTTL  Page_Break
  1492.         PAGE
  1493.  
  1494.  
  1495.         ;-------------------------------------------------------;
  1496.         ;Procedure: Page_Break                                  ;
  1497.         ;       Wait for user to press any key.                 ;
  1498.         ; IN:                                                   ;
  1499.         ;       None                                            ;
  1500.         ; OUT:                                                  ;
  1501.         ;       None                                            ;
  1502.         ;-------------------------------------------------------;
  1503.  
  1504. PAGE_BREAK      PROC NEAR
  1505.  
  1506.         PUSH    AX              ;save caller's registers
  1507.         PUSH    DX
  1508.  
  1509.         CRLF                    ;put a blank line
  1510.         LEA     DX,MORE         ;prompt
  1511.         CALL    STROUT          ;print the prompt
  1512.  
  1513.         CALL    STDIN           ;wait for character (echos)
  1514.         CLEAR_SCREEN            ;clear out the screen
  1515.  
  1516.  
  1517.         POP     DX              ;restore registers
  1518.         POP     AX              ;
  1519.  
  1520.         RET
  1521. PAGE_BREAK ENDP
  1522.  
  1523.  
  1524. CSEG    ENDS
  1525.         END     MAIN
  1526.